import {
  index,
  modelOptions,
  prop,
  DocumentType,
  getModelForClass,
} from '@typegoose/typegoose'
import { ApiProperty, OmitType } from '@nestjs/swagger'

@index({ busRegistNo: 1 })
@modelOptions({
  schemaOptions: {
    collection: 'companys', //数据库集合的名称
    // toJSON: { virtuals: true },
    // toObject: { virtuals: true },
    // 时间填充
    timestamps: true,
  },
})
export class CompanyClass {
  /** 公司名称 */
  @prop({ required: true, minlength: 1, maxlength: 30 })
  @ApiProperty({
    description: '公司名称',
    example: '石家庄某某有限公司',
    required: true,
  })
  public readonly companyName: string

  /** 工商注册号码，必填的、唯一的 */
  @prop({ required: true, unique: true, match: /^[a-zA-Z0-9]{13,22}$/ })
  @ApiProperty({
    description: '工商注册号码',
    example: '9111******401592H',
    required: true,
  })
  public busRegistNo: string

  /** 注册地址 */
  @prop({
    required: true,
  })
  @ApiProperty({
    description: '注册地址',
    example: '石家庄市**区**街**号',
    required: true,
  })
  public address: string

  /** 电话 */
  @prop({ required: true })
  @ApiProperty({
    description: '注册电话',
    example: '0311-8*******',
    required: true,
  })
  public tel: string

  /** 传真 可选的*/
  @prop()
  @ApiProperty({
    description: '传真',
    example: '0311-8*******',
    required: false,
  })
  public fax?: string

  /** 法人代表*/
  @prop({ required: true })
  @ApiProperty({
    required: true,
    description: '法人代表',
    example: '王**',
  })
  public legalPerson: string

  /** 开户银行*/
  @prop({ required: true })
  @ApiProperty({
    description: '开户银行',
    example: '**银行',
    required: true,
  })
  public bankName: string

  /** 银行账号*/
  @prop({ required: true, match: /^[0-9]{5,50}$/ })
  @ApiProperty({
    description: '银行账号',
    example: '**2**',
    required: true,
  })
  public account: string

  /** 邮编 可选的*/
  @prop()
  @ApiProperty({
    description: '邮编',
    example: '05****',
    required: false,
  })
  public postal?: string

  /** 名称简写 可选的*/
  @prop()
  @ApiProperty({
    description: '公司简称',
    example: '某某公司',
    required: false,
  })
  public abbreviation?: string

  /** 状态 */
  @prop()
  @ApiProperty({
    description: '状态',
    example: '1',
    required: false,
  })
  public status?: number

  /** 实体函数,是否包含公司名称中某个字段
   *
   * @param this 实体类
   * @param str 输入的文本参数，公司名中的
   * @returns boolean
   */
  containsName(this: DocumentType<CompanyClass>, str: string) {
    return this.companyName.includes(str)
  }

  /** 静态实例方法，通过公司名取得所有雇员类的集合
   *
   * @param this 公司类
   * @param companyName 公司名称
   * @returns 所有雇员类的集合
   */
  // static async getEmployeesByCompany(
  //   this: ReturnModelType<typeof CompanyClass>,
  //   companyName: string,
  // ) {
  //   const comp = await this.findOne({ name: companyName }).exec();
  //   if (!comp) return;
  //   return await EmployeeModel.find({ companyId: comp.id })
  //     .populate('company')
  //     .exec();
  // }
}
export class UpdateCompanyDto extends OmitType(CompanyClass, [
  'companyName',
] as const) {}

export const CompanyModel = getModelForClass(CompanyClass)
